package com.example.his.api.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.example.his.api.common.PageUtils;
import com.example.his.api.common.R;
import com.example.his.api.controller.form.*;
import com.example.his.api.db.pojo.RoleEntity;
import com.example.his.api.mis.service.RoleService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping ( "/mis/role" )
public class RoleController {

  @Resource
  private RoleService roleService;

  /**
   * 查询所有角色信息
   *
   * @return 包含所有角色信息的响应结果
   */
  @GetMapping ( "/searchAllRole" )
  public R searchAllRole() {
    ArrayList < HashMap > list = roleService.searchAllRole();

    return R.ok().put( "list", list );
  }

  /**
   * 分页查询角色信息
   *
   * @param form 查询条件表单（包含角色名、页码、每页记录数）
   * @return 分页结果封装对象
   */
  @PostMapping ( "/searchByPage" )
  @SaCheckPermission ( value = { "ROOT", "USER:DELETE" }, mode = SaMode.OR )
  public R searchByPage( @Valid @RequestBody SearchRoleByPageForm form ) {

    // 获取当前页码和每页记录数
    int page = form.getPage();
    int length = form.getLength();
    // 计算分页起始位置
    int start = ( page - 1 ) * length;
    // 将表单数据转换为Map参数
    Map param = BeanUtil.beanToMap( form );
    param.put( "start", start );

    // 调用服务层执行分页查询
    PageUtils pageUtils = roleService.searchByPage( param );

    // 返回分页结果
    return R.ok().put( "page", pageUtils );
  }

  /**
   * 新增角色信息
   *
   * @param form 包含角色信息的表单数据（角色名、权限、描述）
   * @return 插入结果，包含影响行数
   */
  @PostMapping ( "/insert" )
  @SaCheckPermission ( value = { "ROOT", "USER:INSERT" }, mode = SaMode.OR )
  public R insert( @Valid @RequestBody InsertRoleForm form ) {
    // 将表单数据转换为角色实体对象
    RoleEntity role = new RoleEntity();
    role.setRoleName( form.getRoleName() );
    // 将权限数组转换为JSON字符串存储
    role.setPermissions( JSONUtil.parseArray( form.getPermissions() ).toString() );
    role.setDesc( form.getDesc() );

    // 调用服务层执行插入操作
    int rows = roleService.insert( role );

    // 返回插入结果
    return R.ok().put( "rows", rows );
  }

  /**
   * 根据ID查询角色信息
   *
   * @param form 包含角色ID的表单数据
   * @return 查询结果，包含角色详细信息
   */
  @PostMapping ( "/searchById" )
  @SaCheckPermission ( value = { "ROOT", "USER:UPDATE" }, mode = SaMode.OR )
  public R searchById( @Valid @RequestBody SearchRoleByIdForm form ) {
    // 调用服务层查询角色信息
    HashMap role = roleService.searchById( form.getId() );

    // 返回查询结果
    return R.ok().put( "result", role );
  }

  /**
   * 修改角色信息
   *
   * @param form 包含角色信息的表单数据（ID、角色名、权限、描述、是否变更）
   * @return 修改结果，包含影响行数，如果角色权限变更则强制下线该角色下的所有用户
   */
  @PostMapping ( "/update" )
  @SaCheckPermission ( value = { "ROOT", "USER:UPDATE" }, mode = SaMode.OR )
  public R update( @Valid @RequestBody UpdateRoleForm form ) {

    RoleEntity role = new RoleEntity();
    role.setId( form.getId() );
    role.setRoleName( form.getRoleName() );
    role.setPermissions( JSONUtil.parseArray( form.getPermissions() ).toString() );
    role.setDesc( form.getDesc() );
    int rows = roleService.update( role );
    if ( rows == 1 && form.getChanged() ) {
      // 把该角色下线
      ArrayList < Integer > list = roleService.searchUserIdByRoleId( form.getId() );
      list.forEach( userId -> {
        StpUtil.logout( userId );
      } );
    }
    return R.ok().put( "rows", rows );
  }

  // 删除角色信息
  @PostMapping ( "/deleteByIds" )
  @SaCheckPermission ( value = { "ROOT", "USER:DELETE" }, mode = SaMode.OR )
  public R deleteByIds( @Valid @RequestBody DeleteRoleByIdsForm form ) {

    int rows = roleService.deleteByIds( form.getIds() );
    return R.ok().put( "rows", rows );

  }

}
